"""
3.	图像金字塔是OpenCV中的重要概念，通常把同一图像的不同分辨率子图的集合叫做图像金字塔，在概念上分为高斯金字塔和拉普拉斯金字塔。
依据下面要求完成代码。（20分）
"""
import cv2 as cv
import numpy as np

# ①	读取leena.jpg图像文件，并进行必要的处理
img_path = 'C4_datasets/leena.jpg'
img = cv.imread(img_path, cv.IMREAD_COLOR)


# ②	对图像进行高斯金字塔处理（level=2）
def GaussianPyramid(img, level, name='img', is_show=False):
    H, W = img.shape[:2]
    if H > W:
        padding = H - W
        img = np.concatenate([img, np.zeros([H, padding, 3], dtype=np.uint8)], axis=1)
    else:
        padding = W - H
        img = np.concatenate([img, np.zeros([padding, W, 3], dtype=np.uint8)], axis=0)
    img = cv.resize(img, (512, 512))
    arr = [img]
    tmp = img
    for lv in range(level):
        target = cv.pyrDown(tmp)
        arr.append(target)
        tmp = target

    if is_show:
        for i, img in enumerate(arr):
            cv.imshow(f'{name}#{i}', img)

    return arr


# ④	显示高斯金字塔图像
GaussianPyramid(img, 2, 'Lenna', True)


# ③	对图像进行拉普拉斯金字塔处理
def LaplacianPyramid(img, level, name='img', is_show=False):
    gaussian_arr = GaussianPyramid(img, level, name, False)
    arr_len = len(gaussian_arr)
    arr = []
    for lv in range(arr_len - 1):
        a = gaussian_arr[lv]
        b = gaussian_arr[lv + 1]
        b = cv.pyrUp(b)
        target = cv.subtract(a, b)
        arr.append(target)

    if is_show:
        for i, img in enumerate(arr):
            cv.imshow(f'{name}_Lap#{i}', img)

    return arr


# ⑤	显示拉普拉斯金字塔图像
LaplacianPyramid(img, 2, 'Lenna', True)

# Finally
cv.waitKey(0)
cv.destroyAllWindows()
